home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2005 October / PCWOCT05.iso / Software / FromTheMag / XAMPP 1.4.14 / xampp-win32-1.4.14-installer.exe / xampp / phpMyAdmin / libraries / charset_conversion.lib.php < prev    next >
PHP Script  |  2004-06-07  |  10KB  |  304 lines

  1. <?php
  2. /* $Id: charset_conversion.lib.php,v 2.5 2004/06/07 13:24:35 nijel Exp $ */
  3. // vim: expandtab sw=4 ts=4 sts=4:
  4.  
  5.  
  6. /**
  7.  * Charset conversion functions.
  8.  */
  9.  
  10.  
  11. /**
  12.  * Loads the recode or iconv extensions if any of it is not loaded yet
  13.  */
  14. if (isset($cfg['AllowAnywhereRecoding'])
  15.     && $cfg['AllowAnywhereRecoding']
  16.     && $allow_recoding) {
  17.  
  18.     if ($cfg['RecodingEngine'] == 'recode') {
  19.         if (!@extension_loaded('recode')) {
  20.             PMA_dl('recode');
  21.             if (!@extension_loaded('recode')) {
  22.                 echo $strCantLoadRecodeIconv;
  23.                 exit;
  24.             }
  25.         }
  26.         $PMA_recoding_engine             = 'recode';
  27.     } else if ($cfg['RecodingEngine'] == 'iconv') {
  28.         if (!@extension_loaded('iconv')) {
  29.             PMA_dl('iconv');
  30.             if (!@extension_loaded('iconv')) {
  31.                 echo $strCantLoadRecodeIconv;
  32.                 exit;
  33.             }
  34.         }
  35.         $PMA_recoding_engine             = 'iconv';
  36.     } else {
  37.         if (@extension_loaded('iconv')) {
  38.             $PMA_recoding_engine         = 'iconv';
  39.         } else if (@extension_loaded('recode')) {
  40.             $PMA_recoding_engine         = 'recode';
  41.         } else {
  42.             PMA_dl('iconv');
  43.             if (!@extension_loaded('iconv')) {
  44.                 PMA_dl('recode');
  45.                 if (!@extension_loaded('recode')) {
  46.                     echo $strCantLoadRecodeIconv;
  47.                     exit;
  48.                 } else {
  49.                     $PMA_recoding_engine = 'recode';
  50.                 }
  51.             } else {
  52.                 $PMA_recoding_engine     = 'iconv';
  53.             }
  54.         }
  55.     }
  56. } // end load recode/iconv extension
  57.  
  58. define('PMA_CHARSET_NONE', 0);
  59. define('PMA_CHARSET_ICONV', 1);
  60. define('PMA_CHARSET_LIBICONV', 2);
  61. define('PMA_CHARSET_RECODE', 3);
  62.  
  63. if (!isset($cfg['IconvExtraParams'])) {
  64.     $cfg['IconvExtraParams'] = '';
  65. }
  66.  
  67. // Finally detects which function will we use:
  68. if (isset($cfg['AllowAnywhereRecoding'])
  69.     && $cfg['AllowAnywhereRecoding']
  70.     && $allow_recoding) {
  71.  
  72.     if (!isset($PMA_recoding_engine)) {
  73.         $PMA_recoding_engine = $cfg['RecodingEngine'];
  74.     }
  75.     if ($PMA_recoding_engine == 'iconv') {
  76.         if (@function_exists('iconv')) {
  77.             $PMA_recoding_engine = PMA_CHARSET_ICONV;
  78.         } else if (@function_exists('libiconv')) {
  79.             $PMA_recoding_engine = PMA_CHARSET_LIBICONV;
  80.         } else {
  81.             $PMA_recoding_engine = PMA_CHARSET_NONE;
  82.  
  83.             if (!isset($GLOBALS['is_header_sent'])) {
  84.                 include('./header.inc.php');
  85.             }
  86.             echo $strCantUseRecodeIconv;
  87.             require_once('./footer.inc.php');
  88.             exit();
  89.         }
  90.     } else if ($PMA_recoding_engine == 'recode') {
  91.         if (@function_exists('recode_string')) {
  92.             $PMA_recoding_engine = PMA_CHARSET_RECODE;
  93.         } else {
  94.             $PMA_recoding_engine = PMA_CHARSET_NONE;
  95.  
  96.             require_once('./header.inc.php');
  97.             echo $strCantUseRecodeIconv;
  98.             require_once('./footer.inc.php');
  99.             exit;
  100.         }
  101.     } else {
  102.         if (@function_exists('iconv')) {
  103.             $PMA_recoding_engine = PMA_CHARSET_ICONV;
  104.         } else if (@function_exists('libiconv')) {
  105.             $PMA_recoding_engine = PMA_CHARSET_LIBICONV;
  106.         } elseif (@function_exists('recode_string')) {
  107.             $PMA_recoding_engine = PMA_CHARSET_RECODE;
  108.         } else {
  109.             $PMA_recoding_engine = PMA_CHARSET_NONE;
  110.  
  111.             require_once('./header.inc.php');
  112.             echo $strCantUseRecodeIconv;
  113.             require_once('./footer.inc.php');
  114.             exit;
  115.         }
  116.     }
  117. } else {
  118.     $PMA_recoding_engine         = PMA_CHARSET_NONE;
  119. }
  120.  
  121.  
  122. /**
  123.  * Converts encoding according to current settings.
  124.  *
  125.  * @param   mixed    what to convert (string or array of strings or object returned by mysql_fetch_field)
  126.  *
  127.  * @return  string   converted string or array of strings
  128.  *
  129.  * @global  array    the configuration array
  130.  * @global  boolean  whether recoding is allowed or not
  131.  * @global  string   the current charset
  132.  * @global  array    the charset to convert to
  133.  *
  134.  * @access  public
  135.  *
  136.  * @author  nijel
  137.  */
  138. function PMA_convert_display_charset($what) {
  139.     global $cfg, $allow_recoding, $charset, $convcharset;
  140.  
  141.     if (!(isset($cfg['AllowAnywhereRecoding']) && $cfg['AllowAnywhereRecoding'] && $allow_recoding)
  142.         || $convcharset == $charset) { // rabus: if input and output charset are the same, we don't have to do anything...
  143.         return $what;
  144.     }
  145.     else if (is_array($what)) {
  146.         $result = array();
  147.         foreach ($what AS $key => $val) {
  148.             if (is_string($val) || is_array($val)) {
  149.                 if (is_string($key)) {
  150.                     $result[PMA_convert_display_charset($key)] = PMA_convert_display_charset($val);
  151.                 } else {
  152.                     $result[$key] = PMA_convert_display_charset($val);
  153.                 }
  154.             } else {
  155.                 $result[$key]     = $val;
  156.             }
  157.         } // end while
  158.         return $result;
  159.     }
  160.     else if (is_string($what)) {
  161.         switch ($GLOBALS['PMA_recoding_engine']) {
  162.             case PMA_CHARSET_RECODE:
  163.                 return recode_string($convcharset . '..'  . $charset, $what);
  164.             case PMA_CHARSET_ICONV:
  165.                 return iconv($convcharset, $charset . $cfg['IconvExtraParams'], $what);
  166.             case PMA_CHARSET_LIBICONV:
  167.                 return libiconv($convcharset, $charset, $what);
  168.             default:
  169.                 return $what;
  170.         }
  171.     }
  172.     else if (is_object($what)) {
  173.         // isn't it object returned from mysql_fetch_field ?
  174.         if (@is_string($what->name)) {
  175.             $what->name = PMA_convert_display_charset($what->name);
  176.         }
  177.         if (@is_string($what->table)) {
  178.             $what->table = PMA_convert_display_charset($what->table);
  179.         }
  180.         if (@is_string($what->Database)) {
  181.             $what->Database = PMA_convert_display_charset($what->Database);
  182.         }
  183.         return $what;
  184.     }
  185.     else {
  186.         // when we don't know what it is we don't touch it...
  187.         return $what;
  188.     }
  189. } //  end of the "PMA_convert_display_charset()" function
  190.  
  191.  
  192. /**
  193.  * Converts encoding of text according to current settings.
  194.  *
  195.  * @param   string   what to convert
  196.  *
  197.  * @return  string   converted text
  198.  *
  199.  * @global  array    the configuration array
  200.  * @global  boolean  whether recoding is allowed or not
  201.  * @global  string   the current charset
  202.  * @global  array    the charset to convert to
  203.  *
  204.  * @access  public
  205.  *
  206.  * @author  nijel
  207.  */
  208. function PMA_convert_charset($what) {
  209.     global $cfg, $allow_recoding, $charset, $convcharset;
  210.  
  211.     if (!(isset($cfg['AllowAnywhereRecoding']) && $cfg['AllowAnywhereRecoding'] && $allow_recoding)
  212.         || $convcharset == $charset) { // rabus: if input and output charset are the same, we don't have to do anything...
  213.         return $what;
  214.     } else {
  215.         switch ($GLOBALS['PMA_recoding_engine']) {
  216.             case PMA_CHARSET_RECODE:
  217.                 return recode_string($charset . '..'  . $convcharset, $what);
  218.             case PMA_CHARSET_ICONV:
  219.                 return iconv($charset, $convcharset . $cfg['IconvExtraParams'], $what);
  220.             case PMA_CHARSET_LIBICONV:
  221.                 return libiconv($charset, $convcharset, $what);
  222.             default:
  223.                 return $what;
  224.         }
  225.     }
  226. } //  end of the "PMA_convert_charset()" function
  227.  
  228. /**
  229.  * Converts encoding of text according to parameters with detected
  230.  * conversion function.
  231.  *
  232.  * @param   string   source charset
  233.  * @param   string   target charset
  234.  * @param   string   what to convert
  235.  *
  236.  * @return  string   converted text
  237.  *
  238.  * @access  public
  239.  *
  240.  * @author  nijel
  241.  */
  242. function PMA_convert_string($src_charset, $dest_charset, $what) {
  243.     if ($src_charset == $dest_charset) return $what;
  244.     switch ($GLOBALS['PMA_recoding_engine']) {
  245.         case PMA_CHARSET_RECODE:
  246.             return recode_string($src_charset . '..'  . $dest_charset, $what);
  247.         case PMA_CHARSET_ICONV:
  248.             return iconv($src_charset, $dest_charset . $GLOBALS['cfg']['IconvExtraParams'], $what);
  249.         case PMA_CHARSET_LIBICONV:
  250.             return libiconv($src_charset, $dest_charset, $what);
  251.         default:
  252.             return $what;
  253.     }
  254. } //  end of the "PMA_convert_string()" function
  255.  
  256.  
  257. /**
  258.  * Converts encoding of file according to parameters with detected
  259.  * conversion function. The old file will be unlinked and new created and
  260.  * its file name is returned.
  261.  *
  262.  * @param   string   source charset
  263.  * @param   string   target charset
  264.  * @param   string   file to convert
  265.  *
  266.  * @return  string   new temporay file
  267.  *
  268.  * @access  public
  269.  *
  270.  * @author  nijel
  271.  */
  272. function PMA_convert_file($src_charset, $dest_charset, $file) {
  273.     switch ($GLOBALS['PMA_recoding_engine']) {
  274.         case PMA_CHARSET_RECODE:
  275.         case PMA_CHARSET_ICONV:
  276.         case PMA_CHARSET_LIBICONV:
  277.             $tmpfname = tempnam('', 'PMA_convert_file');
  278.             $fin      = fopen($file, 'r');
  279.             $fout     = fopen($tmpfname, 'w');
  280.             if ($GLOBALS['PMA_recoding_engine'] == PMA_CHARSET_RECODE) {
  281.                 recode_file($src_charset . '..'  . $dest_charset, $fin, $fout);
  282.             } else {
  283.                 while (!feof($fin)) {
  284.                     $line = fgets($fin, 4096);
  285.                     if ($GLOBALS['PMA_recoding_engine'] == PMA_CHARSET_ICONV) {
  286.                         $dist = iconv($src_charset, $dest_charset . $GLOBALS['cfg']['IconvExtraParams'], $line);
  287.                     } else {
  288.                         $dist = libiconv($src_charset, $dest_charset, $line);
  289.                     }
  290.                     fputs($fout, $dist);
  291.                 } // end while
  292.             }
  293.             fclose($fin);
  294.             fclose($fout);
  295.             unlink($file);
  296.  
  297.             return $tmpfname;
  298.         default:
  299.             return $file;
  300.     }
  301. } //  end of the "PMA_convert_file()" function
  302.  
  303. ?>
  304.